/*-
 * Copyright (c) 2006, 2007 FTS Team
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 4. Neither the name of the FTS Team nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      HTMLDocumentParser.cpp
 *
 * $FTS$
 */

// Local Includes
#include <HTMLDocumentParser.hpp>
#include <PlaintextParser.hpp>

// C includes
#ifdef _DEBUG
  #include <stdio.h>
#endif

#include <Indexer.hpp>
#include <LemCache.hpp>
#include <DocumentStorage.hpp>
#include <DocumentBuilder.hpp>

namespace FTSS // FullTextSearchSystem
{

//
// Constructor
//
HTMLDocumentParser::HTMLDocumentParser()
{
	pPlaintextParser = new PlaintextParser;
}

//
// Store inverted index handler and document storage
//
INT_32 HTMLDocumentParser::SetHandlers(Indexer * pIIndexer, DocumentStorage * pIDocumentStorage, LemCache * pILemCache) throw() { return pPlaintextParser -> SetHandlers(pIIndexer, pIDocumentStorage, pILemCache); }

//
// Parse part of document
//
INT_32 HTMLDocumentParser::ParseChunk(CCHAR_P sIText, const UINT_32 & iTextLength) throw()
{
	CCHAR_P sEnd   = sIText + iTextLength;

	CCHAR_P sTextBegin = sIText;
//	CCHAR_P sTextEnd   = sIText;

	CCHAR_P sChar  = sIText;
//	CCHAR_P sTagStart;
//	CCHAR_P sTagEnd;
	for (;;)
	{
		//sChar != sEnd;
		//IN_TEXT, IN_TAG_START, IN_TAG, IN_TAG_END1, IN_TAG_END2
		if (eParserState == IN_TEXT)
		{
			sTextBegin = sChar;
			while (sChar != sEnd && *sChar != '<') { ++sChar; }
			UINT_32 iTextLength = sChar - sTextBegin;

			if (iTextLength > 0) { pPlaintextParser -> ParseChunk(sTextBegin, sChar - sTextBegin); }

			if (*sChar == '<') { eParserState = IN_TAG_START; ++sChar; }
			else               { break; }
		}
		else if (eParserState == IN_TAG_START)
		{
			if (sChar != sEnd &&
			    ((*sChar >= 'a' && *sChar <= 'z') ||
			     (*sChar >= 'A' && *sChar <= 'Z')))
			{
				eParserState = IN_TAG;
//				sTagStart = sChar;
				++sChar;
			}
		}
		else if (eParserState == IN_TAG)
		{
			while (sChar != sEnd)
			{
				if ((*sChar >= 'a' && *sChar <= 'z') ||
				    (*sChar >= 'A' && *sChar <= 'Z') ||
				    (*sChar >= '0' && *sChar <= '9') ||
				     *sChar >= ':' || *sChar >= '-' || *sChar >= '_')
				{
//					sTagEnd = sChar;
				}
				else { break; }
				++sChar;
			}
			// Check Tag in tag table an dset zone if need....
			// Skip
		}

/*		// Inside a HTML tag
		if (eParserState == IN_TAG)
		{
			if ((*sChar >= 'a' && sChar <= 'z') ||
			    (*sChar >= 'A' && sChar <= 'Z') ||
			    (*sChar >= '0' && sChar <= '9') ||
			     *sChar >= ':' || *sChar >= '-' || *sChar >= '_')
			{
				sTagEnd = sChar;
			}
			else if (sChar == '/') { eParserState = IN_TAG_END1; }
			else if (sChar == '>') { eParserState = IN_TAG_END2; }
		}
		// Found '/', prepare to close tag
		else if (eParserState == IN_TAG_END1)
		{
			if (sChar == '>') { eParserState = IN_TAG_END2; }

		}
		else if (eParserState == IN_TAG_END2)
		{
			eParserState == IN_TAG_END2
		}

		else if (*sChar == '<')
		{
			eParserState = IN_TAG_START;
		}
		else if (eParserState == IN_TAG_START)
		{
			if ((*sChar >= 'a' && sChar <= 'z') ||
			    (*sChar >= 'A' && sChar <= 'Z'))
			{
				eParserState = IN_TAG;
				sTagStart = sChar;
			}
		}
		else
*/
		++sChar;
	}
return -1;
}

//
// Start new document
//
INT_32 HTMLDocumentParser::StartDocument(CCHAR_P sDocName, const UINT_32 & iDocnameLength) throw()
{
	eParserState = IN_TEXT;
return pPlaintextParser -> StartDocument(sDocName, iDocnameLength);
}

//
// Get current token position
//
INT_32 HTMLDocumentParser::GetTokenPos() throw() { return pPlaintextParser -> GetTokenPos(); }

//
// End current document
//
INT_32 HTMLDocumentParser::EndDocument() throw() { return pPlaintextParser -> EndDocument(); }

//
// A destructor
//
HTMLDocumentParser::~HTMLDocumentParser() throw()
{
	delete pPlaintextParser;
}

} // namespace FTSS
// End.
